<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        // 构造函数：给对象动态添加属性，返回这个对象。
        function Hero(name, age, sex, level) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.level = level;

            // console.log(123);
            this.sing = function (address) {
                console.log("来" + address + "开演唱会");
            }

            // console.log(this);
        }

        // 通过构造函数，创建一个对象
        let lvbu = new Hero("吕布", 22, true, 18);
        let zf = new Hero("张飞", 18, true, 22);
        console.log(typeof lvbu);
        console.log(lvbu.name);
        lvbu.sing("郑州");

        /*
            总结：
                1. 构造函数就是类
                2. 通过类这个模块，可以创建对象。
                3. 类是对象公共属性和方法的抽取。
        */

        /*
            构造函数：
                1. 作用，创建对象。
                2. 返回值是一个对象，默认省略
                3. 封装的代码是，给对象多态的添加属性和方法
                4. this 是当前对象
                5. 函数名用大驼峰
                6. 配合关键字 new 使用
                7. 构造函数和类是一码事
                8. 就是对象公共属性和方法的抽取。
                9. 属性名和形参尽量保持一致，可读性强。

            约定大于规范，规范大于编码    
        */


    </script>
</head>

<body>

</body>

</html>